using System.Collections.Generic;
using Avalonia;
using Avalonia.Media;

namespace WalletWasabi.Fluent.Controls;

public enum AxisPlotMode
{
	Normal,
	EvenlySpaced,
	Logarithmic
}

/// <summary>
/// Defines how a label aligns itself along axis.
/// </summary>
public enum LabelAlignment
{
	/// <summary>
	/// The label is auto-aligned.
	/// </summary>
	Auto,

	/// <summary>
	/// The label is left-aligned.
	/// </summary>
	Left,

	/// <summary>
	/// The label is centered.
	/// </summary>
	Center,

	/// <summary>
	/// The label is right-aligned.
	/// </summary>
	Right,
}

public partial class LineChart
{
	// Area

	public static readonly StyledProperty<Thickness> AreaMarginProperty =
		AvaloniaProperty.Register<LineChart, Thickness>(nameof(AreaMargin));

	public static readonly StyledProperty<IBrush?> AreaFillProperty =
		AvaloniaProperty.Register<LineChart, IBrush?>(nameof(AreaFill));

	public static readonly StyledProperty<IBrush?> AreaStrokeProperty =
		AvaloniaProperty.Register<LineChart, IBrush?>(nameof(AreaStroke));

	public static readonly StyledProperty<double> AreaStrokeThicknessProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(AreaStrokeThickness), 1.0);

	public static readonly StyledProperty<IDashStyle?> AreaStrokeDashStyleProperty =
		AvaloniaProperty.Register<LineChart, IDashStyle?>(nameof(AreaStrokeDashStyle));

	public static readonly StyledProperty<PenLineCap> AreaStrokeLineCapProperty =
		AvaloniaProperty.Register<LineChart, PenLineCap>(nameof(AreaStrokeLineCap), PenLineCap.Round);

	public static readonly StyledProperty<PenLineJoin> AreaStrokeLineJoinProperty =
		AvaloniaProperty.Register<LineChart, PenLineJoin>(nameof(AreaStrokeLineJoin), PenLineJoin.Miter);

	public static readonly StyledProperty<double> AreaStrokeMiterLimitProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(AreaStrokeMiterLimit), 10.0);

	public static readonly StyledProperty<double> AreaMinViableHeightProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(AreaMinViableHeight), double.MinValue);

	public static readonly StyledProperty<double> AreaMinViableWidthProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(AreaMinViableWidth), double.MinValue);

	public static readonly StyledProperty<bool> SmoothCurveProperty =
		AvaloniaProperty.Register<LineChart, bool>(nameof(SmoothCurve));

	// XAxis

	public static readonly StyledProperty<IList<double>?> XAxisValuesProperty =
		AvaloniaProperty.Register<LineChart, IList<double>?>(nameof(XAxisValues));

	public static readonly StyledProperty<double?> XAxisMinimumProperty =
		AvaloniaProperty.Register<LineChart, double?>(nameof(XAxisMinimum));

	public static readonly StyledProperty<bool> XAxisLogarithmicScaleProperty =
		AvaloniaProperty.Register<LineChart, bool>(nameof(XAxisLogarithmicScale));

	public static readonly StyledProperty<double> XAxisCurrentValueProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisCurrentValue), double.NaN);

	public static readonly StyledProperty<double> XAxisOpacityProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisOpacity), 1.0);

	public static readonly StyledProperty<Point> XAxisOffsetProperty =
		AvaloniaProperty.Register<LineChart, Point>(nameof(XAxisOffset));

	public static readonly StyledProperty<IBrush?> XAxisStrokeProperty =
		AvaloniaProperty.Register<LineChart, IBrush?>(nameof(XAxisStroke));

	public static readonly StyledProperty<double> XAxisStrokeThicknessProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisStrokeThickness), 1.0);

	public static readonly StyledProperty<double> XAxisArrowSizeProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisArrowSize), 3.5);

	public static readonly StyledProperty<double> XAxisMinViableHeightProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisMinViableHeight), double.MinValue);

	public static readonly StyledProperty<double> XAxisMinViableWidthProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisMinViableWidth), double.MinValue);

	public static readonly StyledProperty<AxisPlotMode> XAxisPlotModeProperty =
		AvaloniaProperty.Register<LineChart, AxisPlotMode>(nameof(XAxisPlotMode), AxisPlotMode.Normal);

	// XAxis Label

	public static readonly StyledProperty<IList<string>?> XAxisLabelsProperty =
		AvaloniaProperty.Register<LineChart, IList<string>?>(nameof(XAxisLabels));

	public static readonly StyledProperty<IBrush?> XAxisLabelForegroundProperty =
		AvaloniaProperty.Register<LineChart, IBrush?>(nameof(XAxisLabelForeground));

	public static readonly StyledProperty<double> XAxisLabelOpacityProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisLabelOpacity), 1.0);

	public static readonly StyledProperty<Point> XAxisLabelOffsetProperty =
		AvaloniaProperty.Register<LineChart, Point>(nameof(XAxisLabelOffset), new Point(0, 5));

	public static readonly StyledProperty<LabelAlignment> XAxisLabelAlignmentProperty =
		AvaloniaProperty.Register<LineChart, LabelAlignment>(nameof(XAxisLabelAlignment), LabelAlignment.Center);

	public static readonly StyledProperty<double> XAxisLabelAngleProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisLabelAngle));

	public static readonly StyledProperty<FontFamily> XAxisLabelFontFamilyProperty =
		AvaloniaProperty.Register<LineChart, FontFamily>(nameof(XAxisLabelFontFamily), FontFamily.Default);

	public static readonly StyledProperty<FontStyle> XAxisLabelFontStyleProperty =
		AvaloniaProperty.Register<LineChart, FontStyle>(nameof(XAxisLabelFontStyle));

	public static readonly StyledProperty<FontWeight> XAxisLabelFontWeightProperty =
		AvaloniaProperty.Register<LineChart, FontWeight>(nameof(XAxisLabelFontWeight), FontWeight.Normal);

	public static readonly StyledProperty<double> XAxisLabelFontSizeProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisLabelFontSize), 10.0);

	// XAxis Title

	public static readonly StyledProperty<string> XAxisTitleProperty =
		AvaloniaProperty.Register<LineChart, string>(nameof(XAxisTitle));

	public static readonly StyledProperty<IBrush?> XAxisTitleForegroundProperty =
		AvaloniaProperty.Register<LineChart, IBrush?>(nameof(XAxisTitleForeground));

	public static readonly StyledProperty<double> XAxisTitleOpacityProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisTitleOpacity), 1.0);

	public static readonly StyledProperty<Point> XAxisTitleOffsetProperty =
		AvaloniaProperty.Register<LineChart, Point>(nameof(XAxisTitleOffset));

	public static readonly StyledProperty<Size> XAxisTitleSizeProperty =
		AvaloniaProperty.Register<LineChart, Size>(nameof(XAxisTitleSize));

	public static readonly StyledProperty<TextAlignment> XAxisTitleAlignmentProperty =
		AvaloniaProperty.Register<LineChart, TextAlignment>(nameof(XAxisTitleAlignment), TextAlignment.Center);

	public static readonly StyledProperty<double> XAxisTitleAngleProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisTitleAngle));

	public static readonly StyledProperty<FontFamily> XAxisTitleFontFamilyProperty =
		AvaloniaProperty.Register<LineChart, FontFamily>(nameof(XAxisTitleFontFamily), FontFamily.Default);

	public static readonly StyledProperty<FontStyle> XAxisTitleFontStyleProperty =
		AvaloniaProperty.Register<LineChart, FontStyle>(nameof(XAxisTitleFontStyle));

	public static readonly StyledProperty<FontWeight> XAxisTitleFontWeightProperty =
		AvaloniaProperty.Register<LineChart, FontWeight>(nameof(XAxisTitleFontWeight), FontWeight.Normal);

	public static readonly StyledProperty<double> XAxisTitleFontSizeProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(XAxisTitleFontSize), 12.0);

	// YAxis

	public static readonly StyledProperty<IList<double>?> YAxisValuesProperty =
		AvaloniaProperty.Register<LineChart, IList<double>?>(nameof(YAxisValues));

	public static readonly StyledProperty<bool> YAxisLogarithmicScaleProperty =
		AvaloniaProperty.Register<LineChart, bool>(nameof(YAxisLogarithmicScale));

	public static readonly StyledProperty<double> YAxisMinValueProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisMinValue), double.NaN);

	public static readonly StyledProperty<double> YAxisMaxValueProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisMaxValue), double.NaN);

	public static readonly StyledProperty<double> YAxisCurrentValueProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisCurrentValue), double.NaN);

	public static readonly StyledProperty<double> YAxisOpacityProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisOpacity), 1.0);

	public static readonly StyledProperty<Point> YAxisOffsetProperty =
		AvaloniaProperty.Register<LineChart, Point>(nameof(YAxisOffset));

	public static readonly StyledProperty<IBrush?> YAxisStrokeProperty =
		AvaloniaProperty.Register<LineChart, IBrush?>(nameof(YAxisStroke));

	public static readonly StyledProperty<double> YAxisStrokeThicknessProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisStrokeThickness), 1.0);

	public static readonly StyledProperty<double> YAxisArrowSizeProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisArrowSize), 3.5);

	public static readonly StyledProperty<double> YAxisMinViableHeightProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisMinViableHeight), double.MinValue);

	public static readonly StyledProperty<double> YAxisMinViableWidthProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisMinViableWidth), double.MinValue);

	// YAxis Label

	public static readonly StyledProperty<IList<string>?> YAxisLabelsProperty =
		AvaloniaProperty.Register<LineChart, IList<string>?>(nameof(YAxisLabels));

	public static readonly StyledProperty<IBrush?> YAxisLabelForegroundProperty =
		AvaloniaProperty.Register<LineChart, IBrush?>(nameof(YAxisLabelForeground));

	public static readonly StyledProperty<double> YAxisLabelOpacityProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisLabelOpacity), 1.0);

	public static readonly StyledProperty<Point> YAxisLabelOffsetProperty =
		AvaloniaProperty.Register<LineChart, Point>(nameof(YAxisLabelOffset), new Point(-5, 0));

	public static readonly StyledProperty<LabelAlignment> YAxisLabelAlignmentProperty =
		AvaloniaProperty.Register<LineChart, LabelAlignment>(nameof(YAxisLabelAlignment), LabelAlignment.Right);

	public static readonly StyledProperty<double> YAxisLabelAngleProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisLabelAngle));

	public static readonly StyledProperty<FontFamily> YAxisLabelFontFamilyProperty =
		AvaloniaProperty.Register<LineChart, FontFamily>(nameof(YAxisLabelFontFamily), FontFamily.Default);

	public static readonly StyledProperty<FontStyle> YAxisLabelFontStyleProperty =
		AvaloniaProperty.Register<LineChart, FontStyle>(nameof(YAxisLabelFontStyle));

	public static readonly StyledProperty<FontWeight> YAxisLabelFontWeightProperty =
		AvaloniaProperty.Register<LineChart, FontWeight>(nameof(YAxisLabelFontWeight), FontWeight.Normal);

	public static readonly StyledProperty<double> YAxisLabelFontSizeProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisLabelFontSize), 10.0);

	// YAxis Title

	public static readonly StyledProperty<string> YAxisTitleProperty =
		AvaloniaProperty.Register<LineChart, string>(nameof(YAxisTitle));

	public static readonly StyledProperty<IBrush?> YAxisTitleForegroundProperty =
		AvaloniaProperty.Register<LineChart, IBrush?>(nameof(YAxisTitleForeground));

	public static readonly StyledProperty<double> YAxisTitleOpacityProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisTitleOpacity), 1.0);

	public static readonly StyledProperty<Point> YAxisTitleOffsetProperty =
		AvaloniaProperty.Register<LineChart, Point>(nameof(YAxisTitleOffset));

	public static readonly StyledProperty<Size> YAxisTitleSizeProperty =
		AvaloniaProperty.Register<LineChart, Size>(nameof(YAxisTitleSize));

	public static readonly StyledProperty<TextAlignment> YAxisTitleAlignmentProperty =
		AvaloniaProperty.Register<LineChart, TextAlignment>(nameof(YAxisTitleAlignment), TextAlignment.Center);

	public static readonly StyledProperty<double> YAxisTitleAngleProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisTitleAngle));

	public static readonly StyledProperty<FontFamily> YAxisTitleFontFamilyProperty =
		AvaloniaProperty.Register<LineChart, FontFamily>(nameof(YAxisTitleFontFamily), FontFamily.Default);

	public static readonly StyledProperty<FontStyle> YAxisTitleFontStyleProperty =
		AvaloniaProperty.Register<LineChart, FontStyle>(nameof(YAxisTitleFontStyle));

	public static readonly StyledProperty<FontWeight> YAxisTitleFontWeightProperty =
		AvaloniaProperty.Register<LineChart, FontWeight>(nameof(YAxisTitleFontWeight), FontWeight.Normal);

	public static readonly StyledProperty<double> YAxisTitleFontSizeProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(YAxisTitleFontSize), 12.0);

	// Cursor

	public static readonly StyledProperty<bool> EnableCursorProperty =
		AvaloniaProperty.Register<LineChart, bool>(nameof(EnableCursor), true);

	public static readonly StyledProperty<IBrush?> CursorStrokeProperty =
		AvaloniaProperty.Register<LineChart, IBrush?>(nameof(CursorStroke));

	public static readonly StyledProperty<double> CursorStrokeThicknessProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(CursorStrokeThickness), 1.0);

	public static readonly StyledProperty<IDashStyle?> CursorStrokeDashStyleProperty =
		AvaloniaProperty.Register<LineChart, IDashStyle?>(nameof(CursorStrokeDashStyle));

	public static readonly StyledProperty<PenLineCap> CursorStrokeLineCapProperty =
		AvaloniaProperty.Register<LineChart, PenLineCap>(nameof(CursorStrokeLineCap), PenLineCap.Round);

	public static readonly StyledProperty<PenLineJoin> CursorStrokeLineJoinProperty =
		AvaloniaProperty.Register<LineChart, PenLineJoin>(nameof(CursorStrokeLineJoin), PenLineJoin.Miter);

	public static readonly StyledProperty<double> CursorStrokeMiterLimitProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(CursorStrokeMiterLimit), 10.0);

	// Border

	public static readonly StyledProperty<IBrush?> BorderBrushProperty =
		AvaloniaProperty.Register<LineChart, IBrush?>(nameof(BorderBrush));

	public static readonly StyledProperty<double> BorderThicknessProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(BorderThickness), 1.0);

	public static readonly StyledProperty<double> BorderRadiusXProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(BorderRadiusX));

	public static readonly StyledProperty<double> BorderRadiusYProperty =
		AvaloniaProperty.Register<LineChart, double>(nameof(BorderRadiusY));

	// Fields

	private bool _captured;

	// ctor

	static LineChart()
	{
		AffectsMeasure<LineChart>(AreaMarginProperty);

		AffectsRender<LineChart>(
			AreaMarginProperty,
			AreaFillProperty,
			AreaStrokeProperty,
			AreaStrokeThicknessProperty,
			AreaStrokeDashStyleProperty,
			AreaStrokeLineCapProperty,
			AreaStrokeLineJoinProperty,
			AreaStrokeMiterLimitProperty);

		AffectsRender<LineChart>(
			XAxisValuesProperty,
			XAxisLogarithmicScaleProperty,
			XAxisCurrentValueProperty,
			XAxisOpacityProperty,
			XAxisOffsetProperty,
			XAxisStrokeProperty,
			XAxisStrokeThicknessProperty,
			XAxisArrowSizeProperty,
			XAxisLabelsProperty,
			XAxisLabelForegroundProperty,
			XAxisLabelOpacityProperty,
			XAxisLabelOffsetProperty,
			XAxisLabelAlignmentProperty,
			XAxisLabelAngleProperty,
			XAxisLabelFontFamilyProperty,
			XAxisLabelFontStyleProperty,
			XAxisLabelFontWeightProperty,
			XAxisLabelFontSizeProperty,
			XAxisTitleProperty,
			XAxisTitleForegroundProperty,
			XAxisTitleOpacityProperty,
			XAxisTitleOffsetProperty,
			XAxisTitleSizeProperty,
			XAxisTitleAlignmentProperty,
			XAxisTitleAngleProperty,
			XAxisTitleFontFamilyProperty,
			XAxisTitleFontStyleProperty,
			XAxisTitleFontWeightProperty,
			XAxisTitleFontSizeProperty);

		AffectsRender<LineChart>(
			YAxisValuesProperty,
			YAxisLogarithmicScaleProperty,
			YAxisMinValueProperty,
			YAxisMaxValueProperty,
			YAxisCurrentValueProperty,
			YAxisOpacityProperty,
			YAxisOffsetProperty,
			YAxisStrokeProperty,
			YAxisStrokeThicknessProperty,
			YAxisArrowSizeProperty,
			YAxisLabelsProperty,
			YAxisLabelForegroundProperty,
			YAxisLabelOpacityProperty,
			YAxisLabelOffsetProperty,
			YAxisLabelAlignmentProperty,
			YAxisLabelAngleProperty,
			YAxisLabelFontFamilyProperty,
			YAxisLabelFontStyleProperty,
			YAxisLabelFontWeightProperty,
			YAxisLabelFontSizeProperty,
			YAxisTitleProperty,
			YAxisTitleForegroundProperty,
			YAxisTitleOpacityProperty,
			YAxisTitleOffsetProperty,
			YAxisTitleSizeProperty,
			YAxisTitleAlignmentProperty,
			YAxisTitleAngleProperty,
			YAxisTitleFontFamilyProperty,
			YAxisTitleFontStyleProperty,
			YAxisTitleFontWeightProperty,
			YAxisTitleFontSizeProperty);

		AffectsRender<LineChart>(
			CursorStrokeProperty,
			CursorStrokeThicknessProperty,
			CursorStrokeDashStyleProperty,
			CursorStrokeLineCapProperty,
			CursorStrokeLineJoinProperty,
			CursorStrokeMiterLimitProperty,
			EnableCursorProperty);

		AffectsRender<LineChart>(
			BorderBrushProperty,
			BorderThicknessProperty,
			BorderRadiusXProperty,
			BorderRadiusYProperty);
	}

	// Area

	public Thickness AreaMargin
	{
		get => GetValue(AreaMarginProperty);
		set => SetValue(AreaMarginProperty, value);
	}

	public IBrush? AreaFill
	{
		get => GetValue(AreaFillProperty);
		set => SetValue(AreaFillProperty, value);
	}

	public IBrush? AreaStroke
	{
		get => GetValue(AreaStrokeProperty);
		set => SetValue(AreaStrokeProperty, value);
	}

	public double AreaStrokeThickness
	{
		get => GetValue(AreaStrokeThicknessProperty);
		set => SetValue(AreaStrokeThicknessProperty, value);
	}

	public IDashStyle? AreaStrokeDashStyle
	{
		get => GetValue(AreaStrokeDashStyleProperty);
		set => SetValue(AreaStrokeDashStyleProperty, value);
	}

	public PenLineCap AreaStrokeLineCap
	{
		get => GetValue(AreaStrokeLineCapProperty);
		set => SetValue(AreaStrokeLineCapProperty, value);
	}

	public PenLineJoin AreaStrokeLineJoin
	{
		get => GetValue(AreaStrokeLineJoinProperty);
		set => SetValue(AreaStrokeLineJoinProperty, value);
	}

	public double AreaStrokeMiterLimit
	{
		get => GetValue(AreaStrokeMiterLimitProperty);
		set => SetValue(AreaStrokeMiterLimitProperty, value);
	}

	public double AreaMinViableHeight
	{
		get => GetValue(AreaMinViableHeightProperty);
		set => SetValue(AreaMinViableHeightProperty, value);
	}

	public double AreaMinViableWidth
	{
		get => GetValue(AreaMinViableWidthProperty);
		set => SetValue(AreaMinViableWidthProperty, value);
	}

	public bool SmoothCurve
	{
		get => GetValue(SmoothCurveProperty);
		set => SetValue(SmoothCurveProperty, value);
	}

	// XAxis

	public IList<double>? XAxisValues
	{
		get => GetValue(XAxisValuesProperty);
		set => SetValue(XAxisValuesProperty, value);
	}

	public double? XAxisMinimum
	{
		get => GetValue(XAxisMinimumProperty);
		set => SetValue(XAxisMinimumProperty, value);
	}

	public bool XAxisLogarithmicScale
	{
		get => GetValue(XAxisLogarithmicScaleProperty);
		set => SetValue(XAxisLogarithmicScaleProperty, value);
	}

	public double XAxisCurrentValue
	{
		get => GetValue(XAxisCurrentValueProperty);
		set => SetValue(XAxisCurrentValueProperty, value);
	}

	public double XAxisOpacity
	{
		get => GetValue(XAxisOpacityProperty);
		set => SetValue(XAxisOpacityProperty, value);
	}

	public Point XAxisOffset
	{
		get => GetValue(XAxisOffsetProperty);
		set => SetValue(XAxisOffsetProperty, value);
	}

	public IBrush? XAxisStroke
	{
		get => GetValue(XAxisStrokeProperty);
		set => SetValue(XAxisStrokeProperty, value);
	}

	public double XAxisStrokeThickness
	{
		get => GetValue(XAxisStrokeThicknessProperty);
		set => SetValue(XAxisStrokeThicknessProperty, value);
	}

	public double XAxisArrowSize
	{
		get => GetValue(XAxisArrowSizeProperty);
		set => SetValue(XAxisArrowSizeProperty, value);
	}

	public double XAxisMinViableHeight
	{
		get => GetValue(XAxisMinViableHeightProperty);
		set => SetValue(XAxisMinViableHeightProperty, value);
	}

	public double XAxisMinViableWidth
	{
		get => GetValue(XAxisMinViableWidthProperty);
		set => SetValue(XAxisMinViableWidthProperty, value);
	}

	public AxisPlotMode XAxisPlotMode
	{
		get => GetValue(XAxisPlotModeProperty);
		set => SetValue(XAxisPlotModeProperty, value);
	}

	// XAxis Label

	public IList<string>? XAxisLabels
	{
		get => GetValue(XAxisLabelsProperty);
		set => SetValue(XAxisLabelsProperty, value);
	}

	public IBrush? XAxisLabelForeground
	{
		get => GetValue(XAxisLabelForegroundProperty);
		set => SetValue(XAxisLabelForegroundProperty, value);
	}

	public double XAxisLabelOpacity
	{
		get => GetValue(XAxisLabelOpacityProperty);
		set => SetValue(XAxisLabelOpacityProperty, value);
	}

	public double XAxisLabelAngle
	{
		get => GetValue(XAxisLabelAngleProperty);
		set => SetValue(XAxisLabelAngleProperty, value);
	}

	public Point XAxisLabelOffset
	{
		get => GetValue(XAxisLabelOffsetProperty);
		set => SetValue(XAxisLabelOffsetProperty, value);
	}

	public LabelAlignment XAxisLabelAlignment
	{
		get => GetValue(XAxisLabelAlignmentProperty);
		set => SetValue(XAxisLabelAlignmentProperty, value);
	}

	public FontFamily XAxisLabelFontFamily
	{
		get => GetValue(XAxisLabelFontFamilyProperty);
		set => SetValue(XAxisLabelFontFamilyProperty, value);
	}

	public FontStyle XAxisLabelFontStyle
	{
		get => GetValue(XAxisLabelFontStyleProperty);
		set => SetValue(XAxisLabelFontStyleProperty, value);
	}

	public FontWeight XAxisLabelFontWeight
	{
		get => GetValue(XAxisLabelFontWeightProperty);
		set => SetValue(XAxisLabelFontWeightProperty, value);
	}

	public double XAxisLabelFontSize
	{
		get => GetValue(XAxisLabelFontSizeProperty);
		set => SetValue(XAxisLabelFontSizeProperty, value);
	}

	// XAxis Title

	public string XAxisTitle
	{
		get => GetValue(XAxisTitleProperty);
		set => SetValue(XAxisTitleProperty, value);
	}

	public IBrush? XAxisTitleForeground
	{
		get => GetValue(XAxisTitleForegroundProperty);
		set => SetValue(XAxisTitleForegroundProperty, value);
	}

	public double XAxisTitleOpacity
	{
		get => GetValue(XAxisTitleOpacityProperty);
		set => SetValue(XAxisTitleOpacityProperty, value);
	}

	public double XAxisTitleAngle
	{
		get => GetValue(XAxisTitleAngleProperty);
		set => SetValue(XAxisTitleAngleProperty, value);
	}

	public Point XAxisTitleOffset
	{
		get => GetValue(XAxisTitleOffsetProperty);
		set => SetValue(XAxisTitleOffsetProperty, value);
	}

	public Size XAxisTitleSize
	{
		get => GetValue(XAxisTitleSizeProperty);
		set => SetValue(XAxisTitleSizeProperty, value);
	}

	public TextAlignment XAxisTitleAlignment
	{
		get => GetValue(XAxisTitleAlignmentProperty);
		set => SetValue(XAxisTitleAlignmentProperty, value);
	}

	public FontFamily XAxisTitleFontFamily
	{
		get => GetValue(XAxisTitleFontFamilyProperty);
		set => SetValue(XAxisTitleFontFamilyProperty, value);
	}

	public FontStyle XAxisTitleFontStyle
	{
		get => GetValue(XAxisTitleFontStyleProperty);
		set => SetValue(XAxisTitleFontStyleProperty, value);
	}

	public FontWeight XAxisTitleFontWeight
	{
		get => GetValue(XAxisTitleFontWeightProperty);
		set => SetValue(XAxisTitleFontWeightProperty, value);
	}

	public double XAxisTitleFontSize
	{
		get => GetValue(XAxisTitleFontSizeProperty);
		set => SetValue(XAxisTitleFontSizeProperty, value);
	}

	// YAxis

	public IList<double>? YAxisValues
	{
		get => GetValue(YAxisValuesProperty);
		set => SetValue(YAxisValuesProperty, value);
	}

	public bool YAxisLogarithmicScale
	{
		get => GetValue(YAxisLogarithmicScaleProperty);
		set => SetValue(YAxisLogarithmicScaleProperty, value);
	}

	public double YAxisMinValue
	{
		get => GetValue(YAxisMinValueProperty);
		set => SetValue(YAxisMinValueProperty, value);
	}

	public double YAxisMaxValue
	{
		get => GetValue(YAxisMaxValueProperty);
		set => SetValue(YAxisMaxValueProperty, value);
	}

	public double YAxisCurrentValue
	{
		get => GetValue(YAxisCurrentValueProperty);
		set => SetValue(YAxisCurrentValueProperty, value);
	}

	public double YAxisOpacity
	{
		get => GetValue(YAxisOpacityProperty);
		set => SetValue(YAxisOpacityProperty, value);
	}

	public Point YAxisOffset
	{
		get => GetValue(YAxisOffsetProperty);
		set => SetValue(YAxisOffsetProperty, value);
	}

	public IBrush? YAxisStroke
	{
		get => GetValue(YAxisStrokeProperty);
		set => SetValue(YAxisStrokeProperty, value);
	}

	public double YAxisStrokeThickness
	{
		get => GetValue(YAxisStrokeThicknessProperty);
		set => SetValue(YAxisStrokeThicknessProperty, value);
	}

	public double YAxisArrowSize
	{
		get => GetValue(YAxisArrowSizeProperty);
		set => SetValue(YAxisArrowSizeProperty, value);
	}

	public double YAxisMinViableHeight
	{
		get => GetValue(YAxisMinViableHeightProperty);
		set => SetValue(YAxisMinViableHeightProperty, value);
	}

	public double YAxisMinViableWidth
	{
		get => GetValue(YAxisMinViableWidthProperty);
		set => SetValue(YAxisMinViableWidthProperty, value);
	}

	// YAxis Label

	public IList<string>? YAxisLabels
	{
		get => GetValue(YAxisLabelsProperty);
		set => SetValue(YAxisLabelsProperty, value);
	}

	public IBrush? YAxisLabelForeground
	{
		get => GetValue(YAxisLabelForegroundProperty);
		set => SetValue(YAxisLabelForegroundProperty, value);
	}

	public double YAxisLabelOpacity
	{
		get => GetValue(YAxisLabelOpacityProperty);
		set => SetValue(YAxisLabelOpacityProperty, value);
	}

	public double YAxisLabelAngle
	{
		get => GetValue(YAxisLabelAngleProperty);
		set => SetValue(YAxisLabelAngleProperty, value);
	}

	public Point YAxisLabelOffset
	{
		get => GetValue(YAxisLabelOffsetProperty);
		set => SetValue(YAxisLabelOffsetProperty, value);
	}

	public LabelAlignment YAxisLabelAlignment
	{
		get => GetValue(YAxisLabelAlignmentProperty);
		set => SetValue(YAxisLabelAlignmentProperty, value);
	}

	public FontFamily YAxisLabelFontFamily
	{
		get => GetValue(YAxisLabelFontFamilyProperty);
		set => SetValue(YAxisLabelFontFamilyProperty, value);
	}

	public FontStyle YAxisLabelFontStyle
	{
		get => GetValue(YAxisLabelFontStyleProperty);
		set => SetValue(YAxisLabelFontStyleProperty, value);
	}

	public FontWeight YAxisLabelFontWeight
	{
		get => GetValue(YAxisLabelFontWeightProperty);
		set => SetValue(YAxisLabelFontWeightProperty, value);
	}

	public double YAxisLabelFontSize
	{
		get => GetValue(YAxisLabelFontSizeProperty);
		set => SetValue(YAxisLabelFontSizeProperty, value);
	}

	// YAxis Title

	public string YAxisTitle
	{
		get => GetValue(YAxisTitleProperty);
		set => SetValue(YAxisTitleProperty, value);
	}

	public IBrush? YAxisTitleForeground
	{
		get => GetValue(YAxisTitleForegroundProperty);
		set => SetValue(YAxisTitleForegroundProperty, value);
	}

	public double YAxisTitleOpacity
	{
		get => GetValue(YAxisTitleOpacityProperty);
		set => SetValue(YAxisTitleOpacityProperty, value);
	}

	public double YAxisTitleAngle
	{
		get => GetValue(YAxisTitleAngleProperty);
		set => SetValue(YAxisTitleAngleProperty, value);
	}

	public Point YAxisTitleOffset
	{
		get => GetValue(YAxisTitleOffsetProperty);
		set => SetValue(YAxisTitleOffsetProperty, value);
	}

	public Size YAxisTitleSize
	{
		get => GetValue(YAxisTitleSizeProperty);
		set => SetValue(YAxisTitleSizeProperty, value);
	}

	public TextAlignment YAxisTitleAlignment
	{
		get => GetValue(YAxisTitleAlignmentProperty);
		set => SetValue(YAxisTitleAlignmentProperty, value);
	}

	public FontFamily YAxisTitleFontFamily
	{
		get => GetValue(YAxisTitleFontFamilyProperty);
		set => SetValue(YAxisTitleFontFamilyProperty, value);
	}

	public FontStyle YAxisTitleFontStyle
	{
		get => GetValue(YAxisTitleFontStyleProperty);
		set => SetValue(YAxisTitleFontStyleProperty, value);
	}

	public FontWeight YAxisTitleFontWeight
	{
		get => GetValue(YAxisTitleFontWeightProperty);
		set => SetValue(YAxisTitleFontWeightProperty, value);
	}

	public double YAxisTitleFontSize
	{
		get => GetValue(YAxisTitleFontSizeProperty);
		set => SetValue(YAxisTitleFontSizeProperty, value);
	}

	// Cursor

	public bool EnableCursor
	{
		get => GetValue(EnableCursorProperty);
		set => SetValue(EnableCursorProperty, value);
	}

	public IBrush? CursorStroke
	{
		get => GetValue(CursorStrokeProperty);
		set => SetValue(CursorStrokeProperty, value);
	}

	public double CursorStrokeThickness
	{
		get => GetValue(CursorStrokeThicknessProperty);
		set => SetValue(CursorStrokeThicknessProperty, value);
	}

	public IDashStyle? CursorStrokeDashStyle
	{
		get => GetValue(CursorStrokeDashStyleProperty);
		set => SetValue(CursorStrokeDashStyleProperty, value);
	}

	public PenLineCap CursorStrokeLineCap
	{
		get => GetValue(CursorStrokeLineCapProperty);
		set => SetValue(CursorStrokeLineCapProperty, value);
	}

	public PenLineJoin CursorStrokeLineJoin
	{
		get => GetValue(CursorStrokeLineJoinProperty);
		set => SetValue(CursorStrokeLineJoinProperty, value);
	}

	public double CursorStrokeMiterLimit
	{
		get => GetValue(CursorStrokeMiterLimitProperty);
		set => SetValue(CursorStrokeMiterLimitProperty, value);
	}

	// Border

	public IBrush? BorderBrush
	{
		get => GetValue(BorderBrushProperty);
		set => SetValue(BorderBrushProperty, value);
	}

	public double BorderThickness
	{
		get => GetValue(BorderThicknessProperty);
		set => SetValue(BorderThicknessProperty, value);
	}

	public double BorderRadiusX
	{
		get => GetValue(BorderRadiusXProperty);
		set => SetValue(BorderRadiusXProperty, value);
	}

	public double BorderRadiusY
	{
		get => GetValue(BorderRadiusYProperty);
		set => SetValue(BorderRadiusYProperty, value);
	}
}
